package flow;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.nio.charset.Charset;

/**
 * 压缩文件解压处理
 *
 * @author zhouxl
 * @DATE 2021/8/23
 * @descripoin
 */
public class CompressFileFlow {

    @Test
    public void compressZip() {
        String rootDir = "D:\\template_documents\\国办PC平台_应用数87_时间20210820";
        File root = new File(rootDir);
        File[] rootFiles = root.listFiles();
        for(File tempFile : rootFiles ){
            if( tempFile.isDirectory() ){
                compressDirToZip(tempFile);
            }
        }
    }


    /**
     * 解压目录为zip文件
     * @param tempFile
     */
    public void compressDirToZip(File tempFile){
        File zipFile = findZipFileName(tempFile);
        if( zipFile == null ){
            return ;
        }
        String dirFileName = findDirFileName(tempFile);
        String zipFileName = zipFile.getName();
        if( dirFileName == null ){
            Charset gbk = Charset.forName("GBK");
            /*
            1.解压zip
            2.删除zip
            3.重新解压目录文件
             */
            ZipUtil.unzip(zipFile,gbk);
            FileUtil.del(zipFile);
            File dirFile = findDirFile(tempFile);
            String newZipPath = dirFile.getParentFile().getAbsolutePath() + File.separator + zipFileName;
            File zip = ZipUtil.zip(dirFile.getAbsolutePath(), newZipPath, true);
        }
    }

    public String findDirFileName(File tempFile){
        File[] files = tempFile.listFiles();
        for(File f :  files ){
            String fileName = f.getName();
            if( f.isDirectory() ){
                return fileName.toLowerCase();
            }
        }
        return null;
    }

    public File findDirFile(File tempFile){
        File[] files = tempFile.listFiles();
        for(File f :  files ){
            String fileName = f.getName();
            if( f.isDirectory() ){
                return f;
            }
        }
        return null;
    }

    /**
     * 删除zip文件
     * @param tempFile
     */
    public void deleteZipFile(File tempFile){
        File[] files = tempFile.listFiles();
        for(File f :  files ){
            String fileName = f.getName();
            String fileSuffixName = getFileSuffix(fileName);
            if( !f.isFile() &&  ".zip".equals(fileSuffixName) && fileSuffixName != null ){
                FileUtil.del(f);
            }
        }
    }

    /**
     * 获取zip的文件名 文件名.zip
     * @param tempFile
     * @return 文件名.zip
     */
    public File findZipFileName(File tempFile){
        File[] files = tempFile.listFiles();
        for(File f :  files ){
            String fileName = f.getName();
            String fileSuffixName = getFileSuffix(fileName);
            if( f.isFile() &&  ".zip".equals(fileSuffixName) && fileSuffixName != null ){
                return f;
            }
        }
        return null;
    }

    // 后缀名
    public String getFileSuffix(String fileName){
        try{
            fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
        }catch (StringIndexOutOfBoundsException ex){
            return null;
        }
        return fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
    }



    /*------------------------------
        测试代码
     */
    @Test
    public void unZipTest(){
        String zipFilePath = "D:\\template_documents\\国办PC平台_应用数87_时间20210820\\四川省施工现场专业人员装饰装修施工员查询\\zjtsgxczyryzszxsgycxpc.zip";
        Charset utf8 = Charset.forName("GBK");
        File zipFile = new File(zipFilePath);
        File unzip = ZipUtil.unzip(zipFile,utf8);
        System.out.println(unzip.getAbsolutePath());
    }

    @Test
    public void compressDirToZipTest(){
        File tempFile = new File("D:\\template_documents\\国办PC平台_应用数87_时间20210820\\四川省建筑施工企业资质建筑幕墙工程专业查询");
        compressDirToZip(tempFile);
    }

}
